<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/jquery-1.7.2.js"></script>
</head>
<body>
<script>
$(function(){
//    作者：Natumsol
//    链接：https://zhuanlan.zhihu.com/p/22387417
//            来源：知乎
//    著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
//
function _LazyMan(name) {
    this.tasks = [];
    var self = this;

    var fn =(function(n){
        var name = n;
        return function(){
            console.log("Hi! This is " + name + "!");
            self.next();
        }
    })(name);
    this.tasks.push(fn);
    setTimeout(function(){
        self.next();
    }, 0); // 在下一个事件循环启动任务
}

    /* 事件调度函数 */
    _LazyMan.prototype.next = function() {
        var fn = this.tasks.shift();
        fn && fn();
    };

    _LazyMan.prototype.eat = function(name) {
        var self = this;
        var fn =(function(name){
            return function(){
                console.log("Eat " + name + "~");
                self.next()
            }
        })(name);
        this.tasks.push(fn);
        return this; // 实现链式调用
    };

    _LazyMan.prototype.sleep = function(time) {
        var self = this;
        var fn = (function(time){
            return function() {
                setTimeout(function(){
                    console.log("Wake up after " + time + "s!");
                    self.next();
                }, time * 1000);
            }
        })(time);
        this.tasks.push(fn);
        return this;
    };

    _LazyMan.prototype.sleepFirst = function(time) {
        var self = this;
        var fn = (function(time) {
            return function() {
                setTimeout(function() {
                    console.log("Wake up after " + time + "s!");
                    self.next();
                }, time * 1000);
            }
        })(time);

        this.tasks.unshift(fn);
        return this;
    };

    /* 封装 */
    function LazyMan(name){
        return new _LazyMan(name);
    }
//    JavaScript异步
})
</script>
</body>
</html>